/**
 * 字符串增加了遍历器接口 Iterator 我们可以使用 for...of循环它
 *
 *
 */

const str = "hello world!";

console.log("----------Symbol.iterator------------------");
// 返回一个迭代器，使用迭代器遍历字符串
const it = str[Symbol.iterator]();
let s = it.next();
while (!s.done) {
  console.log(s.value);
  s = it.next();
}
// 使用for...of遍历字符串，原理就是因为实现了 Iterator 接口
for (const val of str) {
  console.log(val);
}

// 以下是与字符串编码相关的方法
console.log("----------charCodeAt------------------");
console.log(str.charCodeAt(0)); // 方法返回 0 到 65535 之间的整数，表示给定索引处的 UTF-16 代码单元

console.log("----------codePointAt------------------");
console.log(str.codePointAt(0)); // 返回一个 Unicode 编码点值的非负整数。

console.log("----------fromCharCode------------------");
console.log(String.fromCharCode(104)); // 返回由指定的 UTF-16 代码单元序列创建的字符串。

console.log("----------fromCodePoint------------------");
console.log(String.fromCodePoint(104)); // 返回使用指定的代码点序列创建的字符串

// 以下都是截取子串的方法
console.log("----------substring------------------");
console.log(str.substring(1, 2));
console.log(str);

console.log("----------substr------------------");
console.log(str.substr(1, 2));
console.log(str);

console.log("----------slice------------------");
console.log(str.slice(1, 2));
console.log(str);

// 以下都是查找子串的方法
console.log("----------charAt------------------");
console.log(str.charAt(0)); // 返回字符串指定位置的字符

console.log("----------endsWith------------------");
console.log(str.endsWith("!")); // 判断字符串是否以给定的字符串结尾，是返回true，否则返回false

console.log("----------startsWith------------------");
console.log(str.startsWith("!")); // 判断字符串是否以给定的字符串开头，是返回true，否则返回false

console.log("----------includes------------------");
console.log(str.includes("hello")); // 判断一个字符串是否包含某字符串，是返回true，否则返回false
console.log(str.includes("hello", 2)); // 从下标索引2开始查找，默认是0

console.log("----------indexOf------------------");
console.log(str.indexOf("llo")); // 在字符串中查找指定子串，返回首次出现位置的索引，如果没有，返回-1
console.log(str.indexOf("lol", 1));

console.log("----------lastIndexOf------------------");
console.log(str.lastIndexOf("l", 100)); // 在字符串中查找指定子串，返回最后一次出现的位置的索引，查找规则是从后向前找，最后一次出现也就是从后向前首次出现

console.log("----------search------------------");
console.log(str.search(/l/g));

// 以下是拼接字符串的方法
console.log("----------concat------------------");
// 拼接字符串，返回一个新串，原字符串不受影响
let str2 = "123",
  str3 = "456";
const str4 = str.concat(str2, str3);
console.log(str, str4);

console.log("----------padEnd------------------");
console.log("20".padEnd("20".length + 3, ".00")); // 从末尾填充字符串，达到指定长度，超出则截取填充值，

console.log("----------padStart------------------");
console.log("20".padStart("20".length + 2, "0.")); // 从开头填充字符串，达到指定长度，超出则截取填充值

console.log("----------repeat------------------");
console.log("20".repeat(3)); //

// 以下是分割字符串,以数组返回
console.log("----------split------------------");
console.log(str.split(" "));

console.log("----------match------------------");
console.log(str.match(/[(lo)|!]/g)); // 方法返回一个字符串中匹配正则的所有子串，以数组形式返回

// 以下是替换字符串
console.log("----------replace------------------");
console.log(str.replace("l", 2)); // 只替换首次出现的一处

console.log("----------replace------------------");
console.log(str.replaceAll("l", 2)); // 全部替换
